<?php

defined('BASEPATH') or die('forbidden');

/**
 * 表单元素处理类
 * @author  Karson
 * @name    form.php
 * @since   2011-03-19 14:58:04
 */
class Form {

    public $sensitive = '';

    /**
     * 文本框
     * @param string $type 文本框类型
     * @param string $name 文本框的名称
     * @param string $value 文本框的值
     * @param mixed $attr 扩展的属性
     * @return string 返回处理后的数据
     */
    function input($type, $name, $value = '', $attr = array()) {
        $extra = parse_attr($attr);
        switch ($type) {
            case 'text':
                return "<input type=\"text\" name=\"{$name}\" value=\"{$value}\" {$extra} />";
                break;
            case 'password':
                return "<input type=\"password\" name=\"{$name}\" value=\"{$value}\" {$extra} />";
                break;
            case 'textarea':
                return "<textarea name=\"{$name}\" {$extra} />{$value}</textarea>";
                break;
            case 'hidden':
                return "<input type=\"hidden\" name=\"{$name}\" value=\"{$value}\" {$extra} />";
                break;
            case 'file':
                return "<input type= \"file\"name=\"{$name}\" {$extra} />";
                break;
            case 'submit':
                return "<input type=\"submit\" name=\"{$name}\" value=\"$value\" {$extra} />";
                break;
            default:
                return "{$type}类型错误";
                break;
        }
    }

    /**
     * 下拉列表
     * @param string $name 下拉列表的名称
     * @param array $options 下拉列表的列表选项
     * @param array $selected 下拉列表的选中项
     * @param mixed $attr 扩展项
     * @return string 返回处理后的数据
     */
    function select($name = '', $options = array(), $selected = array(), $attr = array()) {
        $extra = parse_attr($attr);
        if (!is_array($selected)) {
            $selected = array($selected);
        }
        if (count($selected) === 0) {
            if (isset($_POST[$name])) {
                $selected = array($_POST[$name]);
            }
        }
        if ($extra != '')
            $extra = ' ' . $extra;
        $multiple = (count($selected) > 1 && strpos($extra, 'multiple') === FALSE) ? ' multiple="multiple"' : '';
        $form = '<select name="' . $name . '"' . $extra . $multiple . ">\n";
        foreach ($options as $key => $val) {
            $key = (string) $key;
            if (is_array($val)) {
                $form .= '<optgroup label="' . $key . '">' . "\n";
                foreach ($val as $optgroup_key => $optgroup_val) {
                    $sel = (in_array($optgroup_key, $selected)) ? ' selected="selected"' : '';
                    $form .= '<option value="' . $optgroup_key . '"' . $sel . '>' . (string) $optgroup_val . "</option>\n";
                }
                $form .= '</optgroup>' . "\n";
            } else {
                $sel = (in_array($key, $selected)) ? ' selected="selected"' : '';
                $form .= '<option value="' . $key . '"' . $sel . '>' . (string) $val . "</option>\n";
            }
        }
        $form .= '</select>';
        return $form;
    }

    /**
     * 验证数据有效性
     * @param string $str 验证的数据
     * @param string $type 验证类型
     * @return string 返回处理后的数据
     */
    function validation($str, $type) {
        switch ($type) {
            case 'money': return preg_match("/^(-|\+)?\d+(\.\d+)?$/", $str);
                break;
            case 'email': return preg_match("/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/", $str);
                break;
            case 'url': return preg_match("/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"])*$/", $str);
                break;
            case 'numeric': return is_numeric($str);
                break;
            case 'chinese': return preg_match("/^[\x7f-\xff]+$/", $str);
                break;
            case 'english': return preg_match("/^[A-Za-z]+$/", $str);
                break;
            case 'numeric_english': return preg_match("/^([a-zA-Z0-9_-])+$/", $str);
                break;
            case 'telephone': return ereg("^[+]?[0-9]+([xX-][0-9]+)*$", $str);
                break;
            case 'sensitive': return preg_match("/{$this->sensitive}/i", $str);
                break;
            default: return preg_match($type, $str);
                break;
        }
    }

    /**
     * 判断是否提交于表单
     * @param string $method 请求的方法，默认为POST，可选GET
     * @return bool 成功返回true,失败返回false
     */
    function is_submit($method = 'POST') {
        global $_SERVER;
        $method = strtoupper($method);
        //判断方法是否相同，及顶级域名是否相同
        if ($_SERVER['REQUEST_METHOD'] == $method && get_domain($_SERVER['HTTP_REFERER']) == get_domain($_SERVER['HTTP_HOST'])) {
            return true;
        } else {
            //throw new Exception("非正常请求[{$method}]");
            return false;
        }
    }

}